『在Linux的世界裡,有些代碼是我們要知道的。』
「代碼?』
『像是之前提到的 run level 0 到6,每個數用都有不同的意思。或是/etc/shadow 裡的 1、5 、6。
/etc/shadow|
---|---
代碼 | 表示 |
---|---|
1 | MD5 |
5 | SHA256 |
6 | SAH512 |
在Linux stearms也有這樣的代碼。
Linux Stearms| |
----|---|----
代碼|表示|縮寫
0|標準輸入|stdin
1|結果正常的標準輸出|stdout
2|結果錯誤的標準輸出|stderr
但重要並不是知道這些代碼,重要的是去控制Linux stearms,就是俗稱的Redirections,也可說是重新導向。』
「這樣看起來,重要的不是會不會踩油門,重要的是要把車開到那裡去的意思?」
『是的。』
「可是...如果你說那個什0、1、2 是代碼,那我在什麼地方確認,你說的是真的? 你幹嘛那表情看我? 我要求證啊...」
『堂堂一個有錢集團下的有錢銀行資訊長,問我去那看0、1 、2 ...這裡,看到沒?』
「哇,竟然真的有!?」
『...恭喜妳,終於見到了哦...真受不了。』
「可是不對啊,如果同時,有很多人,ssh 或 telnet 到這台CentOS,我要怎麼確定,你說的那個基本輸出輸入什麼的,不會亂掉?」
『當妳連線進到Linux後,從Linux的角度來看,它就是多了一個檔案,但那是屬於妳的檔案,它只要把妳的輸入的結果,往新產生的檔案送,就好了。
像,妳輸入tty這個指令,妳就可以看到了。
我現在的這個視窗畫面,對CentOS來說,就是**/dev/pts/2**,運作上就是像這樣子...
代碼 | Linux Stearms | 來源和目的地 |
---|---|---|
0 | stdin | /dev/pts/2 |
1 | stdout | /dev/pts/2 |
2 | stderr | /dev/pts/2 |
到這,有問題嗎?』
「沒有...這不是最基本的嗎?」
『妳10分鐘前,怎麼不這樣說?』
「我又不是進擊的巨人,可以知道未來的事,甚至可以改變未來的事......」
『啊,算了算了,所以,當我們在畫面上輸入,ls 的時候,結果會顯示在我們的營幕上,是因為
指令 |ls|
---|-----|----
代碼|Linux Stearms | 來源和目的地
0|stdin|/dev/pts/2
1|stdout|/dev/pts/2
2|stderr|/dev/pts/2
所以,結果如畫面。
』
「這我懂啊,這麼簡單。」
『這妳要覺得難,妳們銀行資長可以換人了...基本的沒問題,那就來看**Redirections(重新導向)**吧。
像是現在,我一樣輸入 ls 這個指令,但需要將基本的stdout 從 /dev/pts/2 轉換到 /tmp/test.log,請問要怎麼處理?』
「用那個 > 的符號...這就是轉向哦! 常用但不知道是什麼耶...」
指令 |ls > /tmp/test.log|
---|-----|----
代碼|Linux Stearms | 來源和目的地
0|stdin|/dev/pts/2
1|stdout|/tmp/test.log
2|stderr|/dev/pts/2
『是啊,是沒什麼難...那再看一個基本的,如果指令或程式運行過程中,出現錯誤訊息或例外狀況,但我又不要這些訊息,顯示在目前的**/dev/pts/2**,而是希望也一起轉向到 /tmp/testlog』
指令 |ls > /tmp/test.log 2>&1|
---|-----|----
代碼|Linux Stearms | 來源和目的地
0|stdin|/dev/pts/2
1|stdout|/tmp/test.log
2|stderr|/tmp/test.log
『如果,stdout 和 stderr 要是不一樣的結果,那就是
指令 |ls > /tmp/test.log 2> /tmp/error.log|
---|-----|----
代碼|Linux Stearms | 來源和目的地
0|stdin|/dev/pts/2
1|stdout|/tmp/test.log
2|stderr|/tmp/error.log
請問這樣可以嗎?』
「原來是這樣,我懂了。 那我再問你, >和>>,有什麼差別?」
『從結果來看的話,就是
> ,如沒有,則建立新的,或,覆蓋原有的
>>,如沒有,則建立新的,或,附加在原有的最後』
「嗯,懂了。我看你那串咒語,還有直線? 那是幹嘛的?」
『直線? 資訊長...那叫 pipeline...管線...』
「怎樣? 說直線怎樣? 你不懂我在說什麼嗎? 啊? 你懂不懂? 說啊......」
『我不都回答妳是管線了嗎?...真的很煩耶...
這邊的輸出 | 是這邊的輸入
資訊長,這樣了解嗎?』
「我再看一下,你那串咒語...
cat /var/www/html/tmp/today_getwifi-01.csv | awk -F[,] '{print $1,$4,$14}' | sed '/Station/,$d' | head -n -1| tail -n +2 | sed 's/[ ][ ]*/,/g' &> /var/www/html/csv/get.csv
好,可以了,我懂了,講重點吧...」
『哇,資訊長知道,我沒講到重點耶。』
「廢話那麼多的男人......重點是什麼?」
『假設,在現在的CentOS上,有兩個ssh進來的連線,分別是 /dev/pts/0, /dev/pts/1,我是/dev/pts/0,請問資訊長,當我輸入
ls > /dev/pts/1,會發生什麼事?
指令 |ls > /dev/pts/1
---|-----|----
代碼|Linux Stearms | 來源和目的地
0|stdin|/dev/pts/2
1|stdout|/dev/pts/1
2|stderr|/tmp/test.log
』
「什麼事? ls 的結果,會出現在 /dev/pts/1 上面?」
『是啊。』
「真的耶......」
『那請問資訊長,如果...我輸入的是
ls > /dev/tcp/192.168.1.1/9527
請問,會發生什麼事?
(待)
2019/09/27 SunAllen